<!DOCTYPE html>
<html>
    <head>
        <script src="/w3c/resources/testharness.js"></script>
        <script src="/w3c/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
        <link rel='stylesheet' href='/w3c/resources/testharness.css'>
    </head>
    <body>
        <div id="log"></div>
        <script>
          mediasource_test(function(test, mediaElement, mediaSource)
          {
              test.failOnEvent(mediaElement, 'error');
              assert_equals(mediaSource.readyState, 'open');

              assert_throws_js(TypeError,
                  function() { mediaSource.endOfStream('garbage'); },
                  'endOfStream(\'garbage\') throws TypeError');

              assert_equals(mediaSource.readyState, 'open');
              test.done();
          }, 'Test MediaSource.endOfStream() with invalid non-empty error string.');

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              test.failOnEvent(mediaElement, 'error');
              assert_equals(mediaSource.readyState, 'open');

              assert_throws_js(TypeError,
                  function() { mediaSource.endOfStream(''); },
                  'endOfStream(\'\') throws TypeError');

              assert_equals(mediaSource.readyState, 'open');
              test.done();
          }, 'Test MediaSource.endOfStream() with invalid empty error string.');

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              test.failOnEvent(mediaElement, 'error');
              assert_equals(mediaSource.readyState, 'open');

              test.expectEvent(mediaSource, 'sourceend');
              mediaSource.endOfStream();

              assert_equals(mediaSource.readyState, 'ended');
              assert_throws_dom("InvalidStateError",
                  function() {  mediaSource.endOfStream(); },
                  "endofStream() threw an exception when in ended state");
             
              test.done();
          }, 'Test MediaSource.endOfStream() with when readyState is ended.');
          
          mediasource_test(function(test, mediaElement, mediaSource)
          {
              test.failOnEvent(mediaElement, 'error');
              assert_equals(mediaSource.readyState, 'open');

              test.expectEvent(mediaSource, 'sourceend');
              mediaSource.endOfStream();

              assert_equals(mediaSource.readyState, 'ended');
              assert_throws_dom("InvalidStateError",
                  function() {  mediaSource.endOfStream("decode"); },
                  "endofStream() threw an exception when in ended state");
   
              test.done();
          }, 'Test MediaSource.endOfStream(decode) with when readyState is ended.');

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              test.failOnEvent(mediaElement, 'error');
              assert_equals(mediaSource.readyState, 'open');

              test.expectEvent(mediaSource, 'sourceend');
              mediaSource.endOfStream();

              assert_equals(mediaSource.readyState, 'ended');
              assert_throws_dom("InvalidStateError",
                  function() {  mediaSource.endOfStream("network"); },
                  "endofStream() threw an exception when in ended state");
              
              test.done();
          }, 'Test MediaSource.endOfStream(network) with when readyState is ended.');
                              
          mediasource_test(function(test, mediaElement, mediaSource)
          {
              test.failOnEvent(mediaElement, 'error');
              assert_equals(mediaSource.readyState, 'open');

              assert_throws_js(TypeError,
                  function() { mediaSource.endOfStream(null); },
                  'endOfStream(null) throws TypeError');

              assert_equals(mediaSource.readyState, 'open');
              test.done();
          }, 'Test MediaSource.endOfStream() with invalid null error parameter.');
        </script>
    </body>
</html>
